springboot文档阅读 第二章 继承parent与远程调试

继承 starter parent ?

继承的话:

如果你想配置项目,让其继承自spring-boot-starter-parent,只需将parent按如下设置:

1
2
3
4
5
6
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.BUILD-SNAPSHOT</version>
</parent>

:你应该只需在该依赖上指定Spring Boot版本,如果导入其他的starters,放心的省略版本号好了。

按照以上设置,你可以在自己的项目中通过覆盖属性来覆盖个别的依赖。例如,你可以将以下设置添加到pom.xml中来升级Spring Data到另一个发布版本。

1
2
3
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

查看spring-boot-dependencies pom获取支持的属性列表。

spring-boot-starter-parent选择了相当保守的Java兼容策略,如果你遵循我们的建议,使用最新的Java版本,可以添加一个java.version属性:

1
2
3
<properties>
<java.version>1.8</java.version>
</properties>

Spring Boot包含一个[Maven插件](../VIII. Build tool plugins/58. Spring Boot Maven plugin.md),它可以将项目打包成一个可执行jar。如果想使用它,你可以将该插件添加到<plugins>节点处:

1
2
3
4
5
6
7
8
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

:如果使用Spring Boot starter parent pom,你只需添加该插件而无需配置它,除非你想改变定义在partent中的设置。

不继承starter parent的话:

不是每个人都喜欢继承spring-boot-starter-parent POM,比如你可能需要使用公司的标准parent,或只是倾向于显式声明所有的Maven配置。

如果你不想使用spring-boot-starter-parent,通过设置scope=import的依赖,你仍能获取到依赖管理的好处:

1
2
3
4
5
6
7
8
9
10
11
12
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.1.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

以上设置不允许你使用属性覆盖个别依赖,为了达到这个目的,你需要在项目的dependencyManagement节点中,在spring-boot-dependencies实体前插入一个节点。例如,为了将Spring Data升级到另一个发布版本,你需要将以下配置添加到pom.xml中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.1.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

示例中,我们指定了一个BOM,但任何的依赖类型都可以通过这种方式覆盖

远程调试

如果使用Spring Boot Maven或Gradle插件创建一个可执行jar,你可以使用java -jar运行应用。例如:

1
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

Spring Boot支持以远程调试模式运行一个打包的应用,下面的命令可以为应用关联一个调试器:

1
2
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myproject-0.0.1-SNAPSHOT.jar

Java的远程调试在诊断远程应用问题时很有用,不幸的是,当应用部署在你的数据中心外时,它并不总能够启用远程调试。如果你使用基于容器的技术,比如Docker,远程调试设置起来非常麻烦。

为了突破这些限制,devtools支持基于HTTP的远程调试通道。远程客户端在8000端口提供一个本地server,这样远程debugger就可以连接了。一旦连接建立,调试信息就通过HTTP发送到远程应用。你可以使用spring.devtools.remote.debug.local-port属性设置不同的端口。

你需要确保远程应用启动时开启了远程调试功能,通常,这可以通过配置JAVA_OPTS实现,例如,对于Cloud Foundry,你可以将以下内容添加到manifest.yml:

1
2
3
---
env:
JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n"

注意你不需要传递一个address=NNNN的配置项到-Xrunjdwp,如果遗漏了,java会使用一个随机可用端口。

调试基于Internet的远程服务可能很慢,你可能需要增加IDE的超时时间。例如,在Eclipse中你可以从Preferences…选择Java -> Debug,改变Debugger timeout (ms)为更合适的值(60000在多数情况下就能解决)。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×